/**************************************************************************************************
**                                                                                               **
**  文件名称:  bsp_run_man.c                                                                     **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  系统运行管控模块                                                                  **
**  ===========================================================================================  **
**  创建信息:  | 2017-3-16 | LEON | 创建本模块                                                   **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#include "bsp_include.h"
#include "bsp_led_drv.h"
#include "bsp_run_man.h"

/*************************************************************************************************/
/*                           模块宏定义                                                          */
/*************************************************************************************************/
#define RESET_REG_MAX        10                                                /* 复位通知函数最大个数 */

/*************************************************************************************************/
/*                           模块结构体定义                                                      */
/*************************************************************************************************/
typedef struct {
    void    (*c_informer[RESET_REG_MAX])(RESET_TYPE_E event, char *file, INT32U line);
    void    (*b_informer[RESET_REG_MAX])(RESET_TYPE_E event, char *file, INT32U line);
} ECB_T;

/*************************************************************************************************/
/*                           模块静态变量定义                                                    */
/*************************************************************************************************/
static ECB_T s_runecb;

/**************************************************************************************************
**  函数名称:  BSP_RunManInit
**  功能描述:  模块初始化函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void BSP_RunManInit(void)
{
    YX_MEMSET(&s_runecb, 0, sizeof(s_runecb));
}

/**************************************************************************************************
**  函数名称:  BSP_RegistResetInform
**  功能描述:  注册复位通知接口
**  输入参数:  prior: 待处理事件的优先级, 见RESET_PRI_E; fp: 回调函数
**  输出参数:  无
**  返回参数:  成功返回true，失败返回false
**************************************************************************************************/
BOOLEAN BSP_RegistResetInform(void (*fp)(RESET_TYPE_E event, char *file, INT32U line))
{
    INT8U i;

    if (fp == 0) {
        return false;
    }
    
    for (i = 0; i < RESET_REG_MAX; i++) {
        if (s_runecb.c_informer[i] == 0) {
            s_runecb.c_informer[i] = fp;
            s_runecb.b_informer[i] = fp;
            return true;
        }
    }
    
    SYS_ASSERT(false, RETURN_FALSE);
}

/**************************************************************************************************
**  函数名称:  OSL_SystemReset
**  功能描述:  复位设备
**  输入参数:  event: 复位事件; pfile: 出错文件名; line: 出错行号
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void BSP_SystemReset(RESET_TYPE_E event, char *file, INT32U line)
{
    INT8U    i, len;
    char    *ptr;
    
    len = YX_STRLEN(file);
    ptr = file;
    
    for (i = len; i > 0; i--) {
        if (ptr[i - 1] == '\\') {
            break;
        }
    }
    
    ptr += i;
    len -= i;
    
    for (i = 0; i < RESET_REG_MAX; i++) {
        if ((s_runecb.c_informer[i] == s_runecb.b_informer[i]) && (s_runecb.c_informer[i] != 0)) {
             s_runecb.c_informer[i](event, ptr, line);
        }
    }
    
    for (i = 0; i < 10; i++) {                                                  /* 这里是为一些后台操作保留时间 */
        BSP_ReverseLEDPort(LED_MAIN);
        TOOL_SystemDelayms(50);
    }
    
    for (;;) {
        ;
    }
}


